﻿//《C语言从入门到精通》P238
// 第 7 章 指  针
// 7.4 字符串与指针
// 48、字符串数组与指针数组

#include<stdio.h>

int main()
{
	int i;
	int j;


	// 【字符串数组】（相当于二维数组）
	char week[7][10] =
	{
		"Monday",
		"Tuesday",
		"Wednesday",
		"Thursday",
		"Friday",
		"Saturday",
		"Sunday",
	};

	for (i = 0; i < 7; i++)
	{
		puts(week + i);
		// 正如同此前输出字符数组（一维数组）一样，引用的是一维数组的首地址（即数组名），要输出二维数组，需要引用每行的首地址
		// week + i 等价于 week[i]
		// 即也可以写为：“puts(week[i]);”，或者：“printf("%s\n", week[i]);”
	}
	printf("\n");


	// 【指针数组】（是一个元素为指针的一维数组）
	char* month[] =
	{
		"1 月·孟春",
		"2 月·花朝",
		"3 月·桃浪",
		"4 月·麦序",
		"5 月·仲夏",
		"6 月·荷月",
		"7 月·初秋",
		"8 月·清秋",
		"9 月·霜序",
		"10月·玄冬",
		"11月·隆冬",
		"12月·暮岁",
	};
	// 指针数组实际上是将每一个字符串的地址组成了一个数组，实质上等价于如下代码：
	// 实际不这样使用，只是为了证明这个数组的元素的确是指针（即这些字符串的地址）
	/*
	char* A = "1 月·孟春";
	char* B = "2 月·花朝";
	char* C = "3 月·桃浪";
	char* D = "4 月·麦序";
	char* E = "5 月·仲夏";
	char* F = "6 月·荷月";
	char* G = "7 月·初秋";
	char* H = "8 月·清秋";
	char* I = "9 月·霜序";		// 【注意】这里用“i”定义与前面的计数变量“i”冲突
	char* J = "10月·玄冬";		// 【注意】这里用“j”定义与前面的计数变量“j”冲突
	char* K = "11月·隆冬";
	char* L = "12月·暮岁";
	char* month[] = { A,B,C,D,E,F,G,H,I,J,K,L };
	*/


	// 以上代码等价于用二维数组定义：
	// 但二维数组占用空间更多，并且如果字符串长度不一致，只能按最长的字符串定义，会导致利用率低下，故推荐使用指针数组
	/*
	char month[12][20] =
	{
		"1 月·孟春",
		"2 月·花朝",
		"3 月·桃浪",
		"4 月·麦序",
		"5 月·仲夏",
		"6 月·荷月",
		"7 月·初秋",
		"8 月·清秋",
		"9 月·霜序",
		"10月·玄冬",
		"11月·隆冬",
		"12月·暮岁",
	};
	*/


	for (j = 0; j < 12; j++)
	{
		puts(month[j]);
		// 也可以写为：“puts(*(month + j));”，要注意的是，此时month[]数组为一维数组，故不能写为“puts(month + j)”
		// 当然你也可以使用：printf("%s\n", month[j]);
	}

	return 0;
}